]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/omap2420h4/sys_info.c
OMAP242x H4 board update
[karo-tx-uboot.git] / board / omap2420h4 / sys_info.c
index 121d67916df479e8ba380340bbe0d0ca30307df5..9864d3e489238ee66c84120cf4bb72e50488c1c6 100644 (file)
 #include <asm/arch/sys_info.h>
 #include <i2c.h>
 
+/**************************************************************************
+ * get_prod_id() - get id info from chips
+ ***************************************************************************/
+static u32 get_prod_id(void)
+{
+       u32 p;
+       p = __raw_readl(PRODUCTION_ID); /* get production ID */
+       return((p & CPU_242X_PID_MASK) >> 16);
+}
+
 /**************************************************************************
  * get_cpu_type() - low level get cpu type
  * - no C globals yet.
@@ -40,6 +50,14 @@ u32 get_cpu_type(void)
 {
        u32 v;
 
+       switch(get_prod_id()){
+               case 1:;/* 2420 */
+               case 2: return(CPU_2420); break; /* 2420 pop */
+               case 4: return(CPU_2422); break;
+               case 8: return(CPU_2423); break;
+               default: break;  /* early 2420/2422's unmarked */
+       }
+
        v = __raw_readl(TAP_IDCODE_REG);
        v &= CPU_24XX_ID_MASK;
        if (v == CPU_2420_CHIPID) {       /* currently 2420 and 2422 have same id */
@@ -61,6 +79,16 @@ u32 get_cpu_rev(void)
        v = v >> 28;
        return(v+1);  /* currently 2422 and 2420 match up */
 }
+/****************************************************
+ * is_mem_sdr() - return 1 if mem type in use is SDR
+ ****************************************************/
+u32 is_mem_sdr(void)
+{
+       volatile u32 *burst = (volatile u32 *)(SDRC_MR_0+SDRC_CS0_OSET);
+       if(*burst == H4_2420_SDRC_MR_0_SDR)
+               return(1);
+       return(0);
+}
 
 /***********************************************************
  * get_mem_type() - identify type of mDDR part used.
@@ -70,23 +98,39 @@ u32 get_cpu_rev(void)
  *************************************************************/
 u32 get_mem_type(void)
 {
-       volatile u32 *burst = (volatile u32 *)(SDRC_MR_0+SDRC_CS0_OSET);
+       u32 cpu, sdr = is_mem_sdr();
 
-       if (get_cpu_type() == CPU_2422)
+       cpu = get_cpu_type();
+       if (cpu == CPU_2422 || cpu == CPU_2423)
                return(DDR_STACKED);
 
+       if(get_prod_id() == 0x2)
+               return(XDR_POP);
+
        if (get_board_type() == BOARD_H4_MENELAUS)
-               if(*burst == H4_2420_SDRC_MR_0_SDR)
+               if(sdr)
                        return(SDR_DISCRETE);
                else
                        return(DDR_COMBO);
        else
-               if(*burst == H4_2420_SDRC_MR_0_SDR) /* SDP + SDR kit */
+               if(sdr) /* SDP + SDR kit */
                        return(SDR_DISCRETE);
                else
                        return(DDR_DISCRETE); /* origional SDP */
 }
 
+/***********************************************************************
+ * get_cs0_size() - get size of chip select 0/1
+ ************************************************************************/
+u32 get_sdr_cs_size(u32 offset)
+{
+       u32 size;
+       size = __raw_readl(SDRC_MCFG_0+offset) >> 8; /* get ram size field */
+       size &= 0x2FF;   /* remove unwanted bits */
+       size *= SZ_2M;   /* find size in MB */
+       return(size);
+}
+
 /***********************************************************************
  * get_board_type() - get board type based on current production stats.
  *  --- NOTE: 2 I2C EEPROMs will someday be populated with proper info.
@@ -104,7 +148,7 @@ u32 get_board_type(void)
 /******************************************************************
  * get_sysboot_value() - get init word settings (dip switch on h4)
  ******************************************************************/
-u32 get_sysboot_value(void)
+inline u32 get_sysboot_value(void)
 {
        return(0x00000FFF & __raw_readl(CONTROL_STATUS));
 }
@@ -193,22 +237,53 @@ u32 wait_on_value(u32 read_bit_mask, u32 match_value, u32 read_addr, u32 bound)
  *********************************************************************/
 void display_board_info(u32 btype)
 {
-       char cpu_2420[] = "2420";
+       char cpu_2420[] = "2420";   /* cpu type */
        char cpu_2422[] = "2422";
-       char db_men[] = "Menelaus";
-       char db_ip[]= "IP";
-       char *cpu_s, *db_s;
-       u32 cpu = get_cpu_type();
+       char cpu_2423[] = "2423";
+       char db_men[] = "Menelaus"; /* board type */
+       char db_ip[] = "IP";
+       char mem_sdr[] = "mSDR";    /* memory type */
+       char mem_ddr[] = "mDDR";
+       char t_tst[] = "TST";       /* security level */
+       char t_emu[] = "EMU";
+       char t_hs[] = "HS";
+       char t_gp[] = "GP";
+       char unk[] = "?";
 
-       if(cpu == CPU_2420)
-               cpu_s = cpu_2420;
+       char *cpu_s, *db_s, *mem_s, *sec_s;
+       u32 cpu, rev, sec;
+
+       rev = get_cpu_rev();
+       cpu = get_cpu_type();
+       sec = get_device_type();
+
+       if(is_mem_sdr())
+               mem_s = mem_sdr;
        else
+               mem_s = mem_ddr;
+
+       if(cpu == CPU_2423)
+               cpu_s = cpu_2423;
+       else if (cpu == CPU_2422)
                cpu_s = cpu_2422;
+       else
+               cpu_s = cpu_2420;
+
        if(btype ==  BOARD_H4_MENELAUS)
                db_s = db_men;
        else
                db_s = db_ip;
-       printf("TI H4 SDP Base Board with OMAP%s %s Daughter Board\n",cpu_s, db_s);
+
+       switch(sec){
+               case TST_DEVICE: sec_s = t_tst; break;
+               case EMU_DEVICE: sec_s = t_emu; break;
+               case HS_DEVICE:  sec_s = t_hs; break;
+               case GP_DEVICE:  sec_s = t_gp; break;
+               default: sec_s = unk;
+       }
+
+       printf("OMAP%s-%s revision %d\n", cpu_s, sec_s, rev-1);
+       printf("TI H4 SDP Base Board + %s Daughter Board + %s \n", db_s, mem_s);
 }
 
 /*************************************************************************
@@ -230,7 +305,7 @@ u32 get_board_rev(void)
 /********************************************************
  *  get_base(); get upper addr of current execution
  *******************************************************/
-static u32 get_base(void)
+u32 get_base(void)
 {
        u32  val;
        __asm__ __volatile__("mov %0, pc \n" : "=r" (val) : : "memory");
@@ -242,7 +317,7 @@ static u32 get_base(void)
 /********************************************************
  *  get_base2(); get 2upper addr of current execution
  *******************************************************/
-static u32 get_base2(void)
+u32 get_base2(void)
 {
        u32  val;
        __asm__ __volatile__("mov %0, pc \n" : "=r" (val) : : "memory");
@@ -300,3 +375,14 @@ u32 running_from_internal_boot(void)
        else
                return(0);
 }
+
+/*************************************************************
+ *  get_device_type(): tell if GP/HS/EMU/TST
+ *************************************************************/
+u32 get_device_type(void)
+{
+       int mode;
+       mode = __raw_readl(CONTROL_STATUS) & (BIT10|BIT9|BIT8);
+       return(mode >>= 8);
+}
+