Revision a99b646afa8a02571ea298bedca6592d818229cd authored by dingtianhong on 15 August 2017, 03:23:23 UTC, committed by David S. Miller on 15 August 2017, 05:14:50 UTC
When bit4 is set in the PCIe Device Control register, it indicates
whether the device is permitted to use relaxed ordering.
On some platforms using relaxed ordering can have performance issues or
due to erratum can cause data-corruption. In such cases devices must avoid
using relaxed ordering.

The patch adds a new flag PCI_DEV_FLAGS_NO_RELAXED_ORDERING to indicate that
Relaxed Ordering (RO) attribute should not be used for Transaction Layer
Packets (TLP) targeted towards these affected root complexes.

This patch checks if there is any node in the hierarchy that indicates that
using relaxed ordering is not safe. In such cases the patch turns off the
relaxed ordering by clearing the capability for this device.

Signed-off-by: Casey Leedom <leedom@chelsio.com>
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Acked-by: Ashok Raj <ashok.raj@intel.com>
Acked-by: Alexander Duyck <alexander.h.duyck@intel.com>
Acked-by: Casey Leedom <leedom@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 59a361b
Raw File
trace.h
#undef TRACE_SYSTEM
#define TRACE_SYSTEM hda

#if !defined(__HDAC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define __HDAC_TRACE_H

#include <linux/tracepoint.h>
#include <linux/device.h>
#include <sound/hdaudio.h>

#ifndef HDAC_MSG_MAX
#define HDAC_MSG_MAX	500
#endif

struct hdac_bus;
struct hdac_codec;

TRACE_EVENT(hda_send_cmd,
	TP_PROTO(struct hdac_bus *bus, unsigned int cmd),
	TP_ARGS(bus, cmd),
	TP_STRUCT__entry(__dynamic_array(char, msg, HDAC_MSG_MAX)),
	TP_fast_assign(
		snprintf(__get_str(msg), HDAC_MSG_MAX,
			 "[%s:%d] val=0x%08x",
			 dev_name((bus)->dev), (cmd) >> 28, cmd);
	),
	TP_printk("%s", __get_str(msg))
);

TRACE_EVENT(hda_get_response,
	TP_PROTO(struct hdac_bus *bus, unsigned int addr, unsigned int res),
	TP_ARGS(bus, addr, res),
	TP_STRUCT__entry(__dynamic_array(char, msg, HDAC_MSG_MAX)),
	TP_fast_assign(
		snprintf(__get_str(msg), HDAC_MSG_MAX,
			 "[%s:%d] val=0x%08x",
			 dev_name((bus)->dev), addr, res);
	),
	TP_printk("%s", __get_str(msg))
);

TRACE_EVENT(hda_unsol_event,
	TP_PROTO(struct hdac_bus *bus, u32 res, u32 res_ex),
	TP_ARGS(bus, res, res_ex),
	TP_STRUCT__entry(__dynamic_array(char, msg, HDAC_MSG_MAX)),
	TP_fast_assign(
		snprintf(__get_str(msg), HDAC_MSG_MAX,
			 "[%s:%d] res=0x%08x, res_ex=0x%08x",
			 dev_name((bus)->dev), res_ex & 0x0f, res, res_ex);
	),
	TP_printk("%s", __get_str(msg))
);

DECLARE_EVENT_CLASS(hdac_stream,
	TP_PROTO(struct hdac_bus *bus, struct hdac_stream *azx_dev),

	TP_ARGS(bus, azx_dev),

	TP_STRUCT__entry(
		__field(unsigned char, stream_tag)
	),

	TP_fast_assign(
		__entry->stream_tag = (azx_dev)->stream_tag;
	),

	TP_printk("stream_tag: %d", __entry->stream_tag)
);

DEFINE_EVENT(hdac_stream, snd_hdac_stream_start,
	TP_PROTO(struct hdac_bus *bus, struct hdac_stream *azx_dev),
	TP_ARGS(bus, azx_dev)
);

DEFINE_EVENT(hdac_stream, snd_hdac_stream_stop,
	TP_PROTO(struct hdac_bus *bus, struct hdac_stream *azx_dev),
	TP_ARGS(bus, azx_dev)
);

#endif /* __HDAC_TRACE_H */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .

#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE trace

#include <trace/define_trace.h>
back to top