Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 7451
b: refs/heads/master
c: b224cd3
h: refs/heads/master
i:
  7449: c0fa1c4
  7447: 30afad4
v: v3
  • Loading branch information
Andrey Panin authored and Linus Torvalds committed Sep 7, 2005
1 parent 15a5dbe commit 612dfe0
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 89 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8db08ea7e6527eff82d8e45507468003e3cefba3
refs/heads/master: b224cd3a0ca376dd52f382905c1aaf5a83a54692
105 changes: 17 additions & 88 deletions trunk/drivers/char/ipmi/ipmi_si_intf.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ static inline void add_usec_to_timer(struct timer_list *t, long v)
#include <asm/io.h>
#include "ipmi_si_sm.h"
#include <linux/init.h>
#include <linux/dmi.h>

#define IPMI_SI_VERSION "v33"

Expand Down Expand Up @@ -1610,22 +1611,15 @@ typedef struct dmi_ipmi_data
static dmi_ipmi_data_t dmi_data[SI_MAX_DRIVERS];
static int dmi_data_entries;

typedef struct dmi_header
static int __init decode_dmi(struct dmi_header *dm, int intf_num)
{
u8 type;
u8 length;
u16 handle;
} dmi_header_t;

static int decode_dmi(dmi_header_t __iomem *dm, int intf_num)
{
u8 __iomem *data = (u8 __iomem *)dm;
u8 *data = (u8 *)dm;
unsigned long base_addr;
u8 reg_spacing;
u8 len = readb(&dm->length);
u8 len = dm->length;
dmi_ipmi_data_t *ipmi_data = dmi_data+intf_num;

ipmi_data->type = readb(&data[4]);
ipmi_data->type = data[4];

memcpy(&base_addr, data+8, sizeof(unsigned long));
if (len >= 0x11) {
Expand All @@ -1640,12 +1634,12 @@ static int decode_dmi(dmi_header_t __iomem *dm, int intf_num)
}
/* If bit 4 of byte 0x10 is set, then the lsb for the address
is odd. */
ipmi_data->base_addr = base_addr | ((readb(&data[0x10]) & 0x10) >> 4);
ipmi_data->base_addr = base_addr | ((data[0x10] & 0x10) >> 4);

ipmi_data->irq = readb(&data[0x11]);
ipmi_data->irq = data[0x11];

/* The top two bits of byte 0x10 hold the register spacing. */
reg_spacing = (readb(&data[0x10]) & 0xC0) >> 6;
reg_spacing = (data[0x10] & 0xC0) >> 6;
switch(reg_spacing){
case 0x00: /* Byte boundaries */
ipmi_data->offset = 1;
Expand Down Expand Up @@ -1673,7 +1667,7 @@ static int decode_dmi(dmi_header_t __iomem *dm, int intf_num)
ipmi_data->offset = 1;
}

ipmi_data->slave_addr = readb(&data[6]);
ipmi_data->slave_addr = data[6];

if (is_new_interface(-1, ipmi_data->addr_space,ipmi_data->base_addr)) {
dmi_data_entries++;
Expand All @@ -1685,82 +1679,17 @@ static int decode_dmi(dmi_header_t __iomem *dm, int intf_num)
return -1;
}

static int dmi_table(u32 base, int len, int num)
{
u8 __iomem *buf;
struct dmi_header __iomem *dm;
u8 __iomem *data;
int i=1;
int status=-1;
int intf_num = 0;

buf = ioremap(base, len);
if(buf==NULL)
return -1;

data = buf;

while(i<num && (data - buf) < len)
{
dm=(dmi_header_t __iomem *)data;

if((data-buf+readb(&dm->length)) >= len)
break;

if (readb(&dm->type) == 38) {
if (decode_dmi(dm, intf_num) == 0) {
intf_num++;
if (intf_num >= SI_MAX_DRIVERS)
break;
}
}

data+=readb(&dm->length);
while((data-buf) < len && (readb(data)||readb(data+1)))
data++;
data+=2;
i++;
}
iounmap(buf);

return status;
}

static inline int dmi_checksum(u8 *buf)
{
u8 sum=0;
int a;

for(a=0; a<15; a++)
sum+=buf[a];
return (sum==0);
}

static int dmi_decode(void)
static void __init dmi_find_bmc(void)
{
u8 buf[15];
u32 fp=0xF0000;

#ifdef CONFIG_SIMNOW
return -1;
#endif
struct dmi_device *dev = NULL;
int intf_num = 0;

while(fp < 0xFFFFF)
{
isa_memcpy_fromio(buf, fp, 15);
if(memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf))
{
u16 num=buf[13]<<8|buf[12];
u16 len=buf[7]<<8|buf[6];
u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
while ((dev = dmi_find_device(DMI_DEV_TYPE_IPMI, NULL, dev))) {
if (intf_num >= SI_MAX_DRIVERS)
break;

if(dmi_table(base, len, num) == 0)
return 0;
}
fp+=16;
decode_dmi((struct dmi_header *) dev->device_data, intf_num++);
}

return -1;
}

static int try_init_smbios(int intf_num, struct smi_info **new_info)
Expand Down Expand Up @@ -2293,7 +2222,7 @@ static __init int init_ipmi_si(void)
printk("\n");

#ifdef CONFIG_X86
dmi_decode();
dmi_find_bmc();
#endif

rv = init_one_smi(0, &(smi_infos[pos]));
Expand Down

0 comments on commit 612dfe0

Please sign in to comment.