Fix regprop int encoding (Igor Kovalenko)

Wrong encoding of "#address-cells" property can lead to a failure
fetching correct value in my-#acells method. According to docs
properties must be encoded with "encode-int". I spent some time
looking at the docs and it is clear that encode-int produces
quad-sized result (of size /l bytes).

This patch fixes pci helpers to encode to 32bit instead of 64bit values,
and correctes my-address and my-unit methods to read 32bit data
to match encode-int rules
modules/bindings.c: also fixed set_int_property and get_int_property
to match encode-int rules

Signed-off-by: Igor Kovalenko <igor.v.kovalenko@gmail.com>


git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@493 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Igor Kovalenko
2009-05-22 17:14:10 +00:00
committed by Blue Swirl
parent 0ba0e77ecd
commit 02130e8240
4 changed files with 28 additions and 27 deletions

View File

@@ -52,7 +52,7 @@ enum {
MEMORY_SPACE_64 = 3,
};
static inline void pci_encode_phys_addr(cell *phys, int flags, int space_code,
static inline void pci_encode_phys_addr(u32 *phys, int flags, int space_code,
pci_addr dev, uint8_t reg, uint64_t addr)
{
@@ -174,27 +174,27 @@ NODE_METHODS(ob_pci_simple_node) = {
static void pci_set_bus_range(const pci_config_t *config)
{
phandle_t dev = get_cur_dev();
cell props[2];
u32 props[2];
props[0] = (config->dev >> 16) & 0xFF;
props[1] = 1;
set_property(dev, "bus-range", (char *)props, 2 * sizeof(cell));
set_property(dev, "bus-range", (char *)props, 2 * sizeof(props[0]));
}
static void pci_host_set_reg(const pci_config_t *config)
{
phandle_t dev = get_cur_dev();
cell props[2];
u32 props[2];
props[0] = arch->cfg_base;
props[1] = arch->cfg_len;
set_property(dev, "reg", (char *)props, 2 * sizeof(cell));
set_property(dev, "reg", (char *)props, 2 * sizeof(props[0]));
}
static void pci_host_set_ranges(const pci_config_t *config)
{
phandle_t dev = get_cur_dev();
cell props[32];
u32 props[32];
int ncells;
ncells = 0;
@@ -222,7 +222,7 @@ static void pci_host_set_ranges(const pci_config_t *config)
props[ncells++] = 0x00000000;
props[ncells++] = arch->mem_len;
}
set_property(dev, "ranges", (char *)props, ncells * sizeof(cell));
set_property(dev, "ranges", (char *)props, ncells * sizeof(props[0]));
}
int host_config_cb(const pci_config_t *config)
@@ -234,6 +234,7 @@ int host_config_cb(const pci_config_t *config)
set_property(aliases, "pci",
config->path, strlen(config->path) + 1);
//XXX this overrides "reg" property
pci_host_set_reg(config);
pci_host_set_ranges(config);
pci_set_bus_range(config);
@@ -265,7 +266,7 @@ int ide_config_cb2 (const pci_config_t *config)
int eth_config_cb (const pci_config_t *config)
{
phandle_t ph = get_cur_dev();;
phandle_t ph = get_cur_dev();
set_property(ph, "network-type", "ethernet", 9);
set_property(ph, "removable", "network", 8);
@@ -325,7 +326,7 @@ static void pci_set_AAPL_address(const pci_config_t *config)
static void pci_set_assigned_addresses(const pci_config_t *config)
{
phandle_t dev = get_cur_dev();
cell props[32];
u32 props[32];
int ncells;
int i;
uint32_t mask;
@@ -349,13 +350,13 @@ static void pci_set_assigned_addresses(const pci_config_t *config)
}
if (ncells)
set_property(dev, "assigned-addresses", (char *)props,
ncells * sizeof(cell));
ncells * sizeof(props[0]));
}
static void pci_set_reg(const pci_config_t *config)
{
phandle_t dev = get_cur_dev();
cell props[38];
u32 props[38];
int ncells;
int i;
uint32_t mask;
@@ -387,14 +388,14 @@ static void pci_set_reg(const pci_config_t *config)
props[ncells++] = 0x00000000;
props[ncells++] = config->sizes[i];
}
set_property(dev, "reg", (char *)props, ncells * sizeof(cell));
set_property(dev, "reg", (char *)props, ncells * sizeof(props[0]));
}
static void pci_set_ranges(const pci_config_t *config)
{
phandle_t dev = get_cur_dev();
cell props[32];
u32 props[32];
int ncells;
int i;
uint32_t mask;
@@ -423,7 +424,7 @@ static void pci_set_ranges(const pci_config_t *config)
props[ncells++] = config->sizes[i];
}
set_property(dev, "ranges", (char *)props, ncells * sizeof(cell));
set_property(dev, "ranges", (char *)props, ncells * sizeof(props[0]));
}
int macio_heathrow_config_cb (const pci_config_t *config)

View File

@@ -175,9 +175,9 @@ defer find-dev
: my-address ( -- phys.lo ... )
?my-self >in.device-node @
>dn.probe-addr
my-#acells tuck cells + swap 1- 0
my-#acells tuck /l* + swap 1- 0
?do
cell - dup @ swap
/l - dup l@ swap
loop
drop
;
@@ -189,8 +189,8 @@ defer find-dev
: my-unit ( -- phys.lo ... phys.hi )
?my-self >in.my-unit
my-#acells tuck cells + swap 0 ?do
cell - dup @ swap
my-#acells tuck /l* + swap 0 ?do
/l - dup l@ swap
loop
drop
;

View File

@@ -61,8 +61,8 @@ extern void close_dev( ihandle_t ih );
extern void set_property( phandle_t ph, const char *name,
const char *buf, int len );
extern void set_int_property( phandle_t ph, const char *name,
cell val );
extern cell get_int_property( phandle_t ph, const char *name,
u32 val );
extern u32 get_int_property( phandle_t ph, const char *name,
int *retlen );
extern char *get_property( phandle_t ph, const char *name,
int *retlen );

View File

@@ -287,10 +287,10 @@ set_property( phandle_t ph, const char *name, const char *buf, int len )
}
void
set_int_property( phandle_t ph, const char *name, cell val )
set_int_property( phandle_t ph, const char *name, u32 val )
{
cell swapped=__cpu_to_becell(val);
set_property( ph, name, (char*)&swapped, sizeof(cell) );
u32 swapped=__cpu_to_be32(val);
set_property( ph, name, (char*)&swapped, sizeof(swapped) );
}
char *
@@ -312,14 +312,14 @@ get_property( phandle_t ph, const char *name, int *retlen )
return (char*)POP();
}
cell
u32
get_int_property( phandle_t ph, const char *name, int *retlen )
{
cell *p;
u32 *p;
if( !(p=(cell *)get_property(ph, name, retlen)) )
if( !(p=(u32 *)get_property(ph, name, retlen)) )
return 0;
return __becell_to_cpu(*p);
return __be32_to_cpu(*p);
}