return ret ? false : true;
 }
 
+static bool is_amd(const char *arch, const char *cpuid)
+{
+       return arch && !strcmp("x86", arch) && cpuid && strstarts(cpuid, "AuthenticAMD");
+}
+
+static bool is_amd_ibs(struct evsel *evsel)
+{
+       return evsel->core.attr.precise_ip
+           || (evsel->pmu_name && !strncmp(evsel->pmu_name, "ibs", 3));
+}
+
 int evsel__open_strerror(struct evsel *evsel, struct target *target,
                         int err, char *msg, size_t size)
 {
+       struct perf_env *env = evsel__env(evsel);
+       const char *arch = perf_env__arch(env);
+       const char *cpuid = perf_env__cpuid(env);
        char sbuf[STRERR_BUFSIZE];
        int printed = 0, enforced = 0;
 
                        return scnprintf(msg, size,
        "Invalid event (%s) in per-thread mode, enable system wide with '-a'.",
                                        evsel__name(evsel));
+               if (is_amd(arch, cpuid)) {
+                       if (is_amd_ibs(evsel)) {
+                               if (evsel->core.attr.exclude_kernel)
+                                       return scnprintf(msg, size,
+       "AMD IBS can't exclude kernel events.  Try running at a higher privilege level.");
+                               if (!evsel->core.system_wide)
+                                       return scnprintf(msg, size,
+       "AMD IBS may only be available in system-wide/per-cpu mode.  Try using -a, or -C and workload affinity");
+                       }
+               }
+
                break;
        case ENODATA:
                return scnprintf(msg, size, "Cannot collect data source with the load latency event alone. "