Micro-optimize the new arm inline bus_space implementation by grouping all
the data the inline functions access together at the start of the bus_space struct. The start-of part isn't so important, it's the grouping-together that's the point: now all the most-accessed data should be in one cache line. Suggested by: cognet
This commit is contained in:
parent
1aa07d7ef4
commit
33d6283946
@ -150,7 +150,7 @@ static struct bus_space arm_base_bus_space = {
|
|||||||
.bs_wr_2_s = generic_bs_wr_2,
|
.bs_wr_2_s = generic_bs_wr_2,
|
||||||
.bs_wr_4_s = generic_bs_wr_4,
|
.bs_wr_4_s = generic_bs_wr_4,
|
||||||
.bs_wr_8_s = BS_UNIMPLEMENTED,
|
.bs_wr_8_s = BS_UNIMPLEMENTED,
|
||||||
};
|
} __aligned(CACHE_LINE_SIZE);
|
||||||
|
|
||||||
#ifdef FDT
|
#ifdef FDT
|
||||||
bus_space_tag_t fdtbus_bs_tag = &arm_base_bus_space;
|
bus_space_tag_t fdtbus_bs_tag = &arm_base_bus_space;
|
||||||
|
@ -79,9 +79,27 @@
|
|||||||
#define BUS_SPACE_MAP_LINEAR 0x02
|
#define BUS_SPACE_MAP_LINEAR 0x02
|
||||||
#define BUS_SPACE_MAP_PREFETCHABLE 0x04
|
#define BUS_SPACE_MAP_PREFETCHABLE 0x04
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bus space for ARM.
|
||||||
|
*
|
||||||
|
* The functions used most often are grouped together at the beginning to ensure
|
||||||
|
* that all the data fits into a single cache line. The inline implementations
|
||||||
|
* of single read/write access these values a lot.
|
||||||
|
*/
|
||||||
struct bus_space {
|
struct bus_space {
|
||||||
/* cookie */
|
/* Read/write single and barrier: the most commonly used functions. */
|
||||||
void *bs_privdata;
|
uint8_t (*bs_r_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
||||||
|
uint32_t (*bs_r_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
||||||
|
void (*bs_w_1)(bus_space_tag_t, bus_space_handle_t,
|
||||||
|
bus_size_t, uint8_t);
|
||||||
|
void (*bs_w_4)(bus_space_tag_t, bus_space_handle_t,
|
||||||
|
bus_size_t, uint32_t);
|
||||||
|
void (*bs_barrier)(bus_space_tag_t, bus_space_handle_t,
|
||||||
|
bus_size_t, bus_size_t, int);
|
||||||
|
|
||||||
|
/* Backlink to parent (if copied), and implementation private data. */
|
||||||
|
struct bus_space *bs_parent;
|
||||||
|
void *bs_privdata;
|
||||||
|
|
||||||
/* mapping/unmapping */
|
/* mapping/unmapping */
|
||||||
int (*bs_map) (bus_space_tag_t, bus_addr_t, bus_size_t,
|
int (*bs_map) (bus_space_tag_t, bus_addr_t, bus_size_t,
|
||||||
@ -97,15 +115,8 @@ struct bus_space {
|
|||||||
void (*bs_free) (bus_space_tag_t, bus_space_handle_t,
|
void (*bs_free) (bus_space_tag_t, bus_space_handle_t,
|
||||||
bus_size_t);
|
bus_size_t);
|
||||||
|
|
||||||
/* get kernel virtual address */
|
/* Read single, the less commonly used functions. */
|
||||||
/* barrier */
|
|
||||||
void (*bs_barrier) (bus_space_tag_t, bus_space_handle_t,
|
|
||||||
bus_size_t, bus_size_t, int);
|
|
||||||
|
|
||||||
/* read (single) */
|
|
||||||
uint8_t (*bs_r_1) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
|
||||||
uint16_t (*bs_r_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
uint16_t (*bs_r_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
||||||
uint32_t (*bs_r_4) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
|
||||||
uint64_t (*bs_r_8) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
uint64_t (*bs_r_8) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
||||||
|
|
||||||
/* read multiple */
|
/* read multiple */
|
||||||
@ -128,13 +139,9 @@ struct bus_space {
|
|||||||
void (*bs_rr_8) (bus_space_tag_t, bus_space_handle_t,
|
void (*bs_rr_8) (bus_space_tag_t, bus_space_handle_t,
|
||||||
bus_size_t, uint64_t *, bus_size_t);
|
bus_size_t, uint64_t *, bus_size_t);
|
||||||
|
|
||||||
/* write (single) */
|
/* Write single, the less commonly used functions. */
|
||||||
void (*bs_w_1) (bus_space_tag_t, bus_space_handle_t,
|
|
||||||
bus_size_t, uint8_t);
|
|
||||||
void (*bs_w_2) (bus_space_tag_t, bus_space_handle_t,
|
void (*bs_w_2) (bus_space_tag_t, bus_space_handle_t,
|
||||||
bus_size_t, uint16_t);
|
bus_size_t, uint16_t);
|
||||||
void (*bs_w_4) (bus_space_tag_t, bus_space_handle_t,
|
|
||||||
bus_size_t, uint32_t);
|
|
||||||
void (*bs_w_8) (bus_space_tag_t, bus_space_handle_t,
|
void (*bs_w_8) (bus_space_tag_t, bus_space_handle_t,
|
||||||
bus_size_t, uint64_t);
|
bus_size_t, uint64_t);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user